package model

import "github.com/rs/xid"

// Moon 消息
type Message struct {
	Header    MessageHeader
	Operation int32
	Content   interface{}
}

// Planet 消息
type PlanetMessage struct {
	*Message
	MoonID string // 接收时，MoonID是消息的来源，发送时是目标边缘节点
}

func (message *PlanetMessage) CreateReplay() PlanetMessage {
	reply := message.Message.CreateReplay()
	return PlanetMessage{
		MoonID:  message.MoonID,
		Message: &reply,
	}
}

type MessageHeader struct {
	ID          string // 消息的id
	ParentID    string // 上一个id
	Source      string // 消息来源
	Destination string // 消息的目的地
	Sync        bool   // 是否是同步消息，当传输的是流消息时标识流的终止
	Stream      bool   // 是否是流消息
}

func NewMessage(source, destination string) Message {
	return Message{
		Header: MessageHeader{
			ID:          GenMessageID(),
			ParentID:    "",
			Source:      source,
			Destination: destination,
		},
	}
}

func (message *Message) CreateReplay() Message {
	return Message{
		Header: MessageHeader{
			ID:          GenMessageID(),
			ParentID:    message.Header.ID,
			Source:      message.Header.Destination,
			Destination: message.Header.Source,
			Sync:        message.Header.Sync,
		},
	}
}

func GenMessageID() string {
	return xid.New().String()
}
